package com.ehsy.statement;

import com.dtflys.forest.Forest;
import com.dtflys.forest.config.ForestConfiguration;
import com.ehsy.service.FileService;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockMultipartFile;

import javax.annotation.Resource;
import java.io.*;

/**
 * @author YanZhen_Li
 * @version 1.0
 * @title V
 * @description
 * <a href = "https://forest.dtflyx.com/pages/1.5.36/upload_download/#%E8%A1%A8%E5%8D%95%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0">官方文档查看地址</a>
 * @create 2024/6/19 15:46
 */
@SpringBootTest
public class A21文件上传和下载 {
    @Resource
    FileService service;
    /**
     * 表单文件上传
     */
    @Test
    public void test1() {
        String s = service.test01("pom.xml", progress -> {
            System.out.println("文件大小: " + progress.getTotalBytes());   // 文件大小
            System.out.println("已上传字节: " + progress.getCurrentBytes());   // 已上传字节数
            System.out.println("已上传百分比: " + Math.round(progress.getRate() * 100) + "%");  // 已上传百分比
            if (progress.isDone()) {   // 是否上传完成
                System.out.println("--------   Upload Completed!   --------");
            }
        });
        System.out.println(s);
    }

    /**
     * 使用二进制自己类型来进行文件上传
     */
    @Test
    public void test2(){
        String s = service.test02("大家好啊，我是一个测试文件，你们可以拿我来做测试看看".getBytes(), "test.txt");
        System.out.println(s);
    }

    @Test
    public void test3(){
        String s = service.test03(new ByteArrayInputStream("大家好啊，我是一个测试文件，你们可以拿我来做测试看看".getBytes()), "test.txt");
        System.out.println(s);
    }

    /**
     * 使用spring的MockMultipartFile对象进行上传文件，这样上传文件的话我们不需要进行文件的读取，可以直接把方法中获取到的我文件进行上传
     * @throws IOException
     */
    @Test
    public void test4() throws IOException {
        File file = new File("pom.xml");
        FileInputStream inputStream = new FileInputStream(file);
        byte[] bytes = IOUtils.toByteArray(inputStream);
        // 关闭输入流
        inputStream.close();
        // 将文件输入流转为字节数组
        MockMultipartFile mockMultipartFile = new MockMultipartFile(file.getName(), file.getName(), "text/plain", bytes);
        String s = service.test04(mockMultipartFile, progress -> {
            System.out.println("文件大小: " + progress.getTotalBytes());   // 文件大小
            System.out.println("已上传字节: " + progress.getCurrentBytes());   // 已上传字节数
            System.out.println("已上传百分比: " + Math.round(progress.getRate() * 100) + "%");  // 已上传百分比
            if (progress.isDone()) {   // 是否上传完成
                System.out.println("--------   Upload Completed!   --------");
            }
        });
        System.out.println(s);
    }

    /**
     * 使用spring的Resource进行上传
     */
    @Test
    public void test5() throws IOException {
        // 使用spring的Resource进行上传
        org.springframework.core.io.Resource resource = new org.springframework.core.io.ClassPathResource("test.txt");
        String s = service.test05(resource);
        System.out.println(s);
    }

    /**
     *  带上表单参数上传文件
     */
    @Test
    public void test6(){
        File file = new File("pom.xml");
        String s = service.test06(file, "数据1", 10086);
        System.out.println(s);
    }

    /**
     * ! 批量上传文件 略
     */

    /**
     * ! 二进制文件上传, 在前面的其他地方已经尝试过了，所以这里不再重复 略
     */

    /**
     * 文件下载
     */
    @Test
    public void test7() throws IOException {
        // 创建Forest配置对象
        ForestConfiguration configuration = Forest.config();
        // 设置连接超时时间（单位：毫秒）
        configuration.setConnectTimeout(100000);
        // 设置读取超时时间（单位：毫秒）
        configuration.setReadTimeout(100000);

        // 因为我的下载接口做了限速，所以我们需要配置请求的连接时间
        File test1 = service.test07("D:\\logs", "a001.png", progress -> {
            System.out.println("total bytes: " + progress.getTotalBytes());   // 文件大小
            System.out.println("current bytes: " + progress.getCurrentBytes());   // 已下载字节数
            System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%");  // 已下载百分比
            if (progress.isDone()) {   // 是否下载完成
                System.out.println("--------   Download Completed!   --------");
            }
        });
        byte[] test2 = service.test08();
        InputStream test3 = service.test09();
        // 下面的代码只是为了查看是否真的下载到了文件
        // ! 注意: 记得用完之后关闭我们的Stream
        byte[] bytes = new byte[20340];
        int read = test3.read(bytes);
        System.out.println(bytes);
        test3.close();
        System.out.println(test1);
        System.out.println(test2);
        System.out.println(test3);
    }
}
